home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / misc / amag / 12b92.lha / Tips & Tricks / Dezimalstrings (Assembler) / Str2Long.txt < prev    next >
Text File  |  1992-11-02  |  3KB  |  54 lines

  1. Dezimalstring in Longword
  2.  
  3. Assembler-Programmierer sind bereits bei einfachen Ein- und Ausgaben
  4. von ganzen Zahlen auf sich gestellt: Während Hochsprachen dem
  5. Software-Autor komfortable Routinen wie »printf« oder »scanf« zur
  6. Verfügung stellen, muß sich der Assembler-Freak diese selbst
  7. schreiben.
  8.  
  9. Für die Ausgabe einer ganzen Zahl sollte die Funktion »RawDoFmt()« der
  10. »exec.library« verwendet werden. Eine ähnliche Routine für Umwandlung
  11. eines Strings in ein Longword existiert in der Library allerdings
  12. nicht. Soll nun eine Dezimalzahl in ein Longword übersetzt werden,
  13. nutzen viele Autoren folgenden Algorithmus:
  14.  
  15. Beginnend mit der letzten
  16. Ziffer werden diese sukzessive mit dem jeweiligen Stellenwert
  17. (1, 10, 100,...) multipliziert und anschließend die Produkte addiert.
  18. Nachteilig an diesem Verfahren ist, daß man vorab die gesamte
  19. Zeichenkette lesen und dann anschließend auf die zuvor übersprungenen
  20. Zeichen zugreifen muß.
  21.  
  22. Dieses Handikap weist der im Listing ».asm« verwandte Algorithmus
  23. nicht auf. Zunächst liest er die erste Ziffer und betrachtet deren
  24. Wert als vorläufiges Ergebnis. Nun werden die folgenden Zeichen
  25. behandelt, bis man auf eine ungültige Ziffer trifft. Bei jeder Stelle
  26. wird das bisherige Ergebnis mit der Basis 10 multipliziert und der
  27. Wert der Ziffer addiert. Beim String »234« würde das Verfahren z.B.
  28. das vorläufige Ergebnis 2 mit 10 malnehmen und 3 dazuzählen,
  29. um abschließend 23 mit 10 zu multiplizieren und 4 addieren. Das
  30. Endergebnis lautet so 234.
  31.  
  32. Dieses Verfahren ist nicht nur auf das Dezimalsystem beschränkt,
  33. sondern gilt für alle anderen Stellenwertsysteme (z.B. Dual-, Oktal-,
  34. Hexadezimalsystem). Das vorläufige Ergebnis wird allgemein mit der
  35. Basis multipliziert. Für diese arithmetische Operation scheidet
  36. allerdings die MULU-Anweisung des 68000er-Prozessors aus, da der
  37. Befehl zwei 16-Bit-Words multipliziert, wenngleich hier das vorläufige
  38. Ergebnis überhalb dieser Grenze liegen kann. Deshalb muß man einen
  39. alternativen Weg eingeschlagen, wobei aber das Abfangen eines
  40. Überlaufs (engl. overflow) auf keinen Fall unterbleiben darf. Bei
  41. Zweierpotenzen als Basis kann sukzessive der ADD-Befehl zum Verdoppeln
  42. des Wertes verwendet werden (die LSL-Anweisung wäre langsamer). Möchte
  43. man einen Faktor mit der Basis 10 multiplizieren, spaltet man die
  44. Operation auf:
  45.  
  46. 10*Faktor = 2*Faktor + 2^2*2*Faktor
  47.  
  48. Der Faktor wird
  49. also zuerst verdoppelt und dann in ein Hilfsregister übertragen. Den
  50. Inhalt des Hilfsregisters verschiebt man um zwei Dualstellen, bevor er
  51. schließlich addiert wird.
  52.  
  53. Roger Fishlin
  54.